import requests  # 发送请求 第三方模块 pip install requests
import parsel  # 数据解析 第三方面模块 pip install parsel
import csv  # 内置模块

f = open('书籍.csv', mode='a', encoding='utf-8', newline='')
# fieldnames 表头
csv_writer = csv.DictWriter(f, fieldnames=['标题', '推荐', '评价', '作者', '出版日期', '出版社', '原价', '售价', '电子书价格', '详情页'])
csv_writer.writeheader()  # 写入表头

'''
打开cmd，输入 pip install 模块名， 即可安装第三方模块
'''

url = 'http://bang.dangdang.com/books/newhotsales/01.00.00.00.00.00-recent7-0-0-1-1'
# 发送请求时 需鞋带请求头
# 请求头作用：把python代码伪装成浏览器，对服务器发送请求，然后服务器会给我们返回响应数据
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67'
}
response = requests.get(url=url, headers=headers)
# 200 状态码 表示请求成功    response.text获取网页源代码（获取响应体的文本数据）
# print(response.text)

# 解析数据  ...  re 正则表达式  xpath  css选择器
selector = parsel.Selector(response.text)
# css选择器 根据标签的属性内容 提取数据
# 第一次提取所有li标签
lis = selector.css('ul.bang_list li')
for li in lis:
    # get() 获取标签的数据内容 返回数据字符串
    # getall() 获取所有标签数据内容
    # attr() 属性选择器
    # ::text 获取标签的文本数据
    # div:nth-child(5) 选择第几个div标签
    # . class  # ID
    # div:nth-child(5) a:nth-child(1) 选择第几个元素
    title = li.css('.name a::attr(title)').get()  # 书名
    href = li.css('.name a::attr(href)').get()  # 详情页
    recommend = li.css('.tuijian::text').get()  # 推荐
    star = li.css('.star a::text').get()  # 评价
    author = li.css('div:nth-child(5) a:nth-child(1)::attr(title)').get()  # 作者
    date = li.css('div:nth-child(6) span::text').get()  # 出版日期
    press = li.css('div:nth-child(6) a::text').get()  # 出版社
    price_r = li.css('.price .price_r::text').get()  # 原价
    price_n = li.css('.price .price_n::text').get()  # 售价
    price_e = li.css('.price_e span::text').get()  # 电子书售价
    dit = {
        '标题': title,
        '推荐': recommend,
        '评价': star,
        '作者': author,
        '出版日期': date,
        '出版社': press,
        '原价': price_r,
        '售价': price_n,
        '电子书价格': price_e,
        '详情页': href
    }
    csv_writer.writerow(dit)
    print(title, recommend, star, author, date, press, price_r, price_n, price_e, href, sep=' | ')
